package com.hnas.core.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerUtil {
	
	public LoggerUtil() {
	}
	
	/**
	 * 获得Logger
	 * @Title: getLogger  
	 * @Description:  
	 * @param clazz 日志发出的类
	 * @return Logger
	 * @throws
	 */
    public static  Logger getLogger(Class<?> clazz) {
    	return LoggerFactory.getLogger(clazz);
    }

    /**
     * 获得Logger
     * @Title: getLogger  
     * @Description:  
     * @param name 自定义的日志发出者名称
     * @return Logger
     * @throws
     */
    public static Logger getLogger(String name) {
    	return LoggerFactory.getLogger(name);
    }

    /**
     * 获得日志，自动判定日志发出者
     * @Title: getLogger  
     * @Description:  
     * @return
     * @throws
     */
    public static Logger getLogger() {
    	StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    	return LoggerFactory.getLogger(stackTrace[2].getClassName());
    }

    //----------------------------------------------------------- Logger method start

    //------------------------ Trace
    /**
     * Trace等级日志，小于debug<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: trace  
     * @Description:  
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void trace(String format, Object... arguments) {
        trace(innerGet(), format, arguments);
    }

    /**
     * Trace等级日志，小于Debug
     * @Title: trace  
     * @Description:  
     * @param log 日志对象
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void trace(Logger log, String format, Object... arguments) {
    	log.trace(format, arguments);
    }

    //------------------------ debug

    /**
     * Debug等级日志，小于Info<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: debug  
     * @Description:  
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void debug(String format, Object... arguments) {
        debug(innerGet(), format, arguments);
    }

    /**
     * Debug等级日志，小于Info
     * @Title: debug  
     * @Description:  
     * @param log 日志对象
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void debug(Logger log, String format, Object... arguments) {
        log.debug(format, arguments);
    }

    //------------------------ info

    /**
     * Info等级日志，小于Warn<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: info  
     * @Description:  
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void info(String format, Object... arguments) {
        info(innerGet(), format, arguments);
    }

    /**
     * Info等级日志，小于Warn
     * @Title: info   
     * @Description:  
     * @param log 日志对象
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws 
     */
    public static void info(Logger log, String format, Object... arguments) {
        log.info(format, arguments);
    }

    //------------------------ warn
    /**
     * Warn等级日志，小于Error<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: warn  
     * @Description:  
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void warn(String format, Object... arguments) {
        warn(innerGet(), format, arguments);
    }

    /**
     * Warn等级日志，小于Error
     * @Title: warn  
     * @Description:  
     * @param log 日志对象
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void warn(Logger log, String format, Object... arguments) {
        log.warn(format, arguments);
    }

    /**
     * Warn等级日志，小于Error<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: warn  
     * @Description:  
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void warn(Throwable e, String format, Object... arguments) {
        warn(innerGet(), e, format(format, arguments));
    }

    /**
     * Warn等级日志，小于Error
     * @Title: warn  
     * @Description:  
     * @param log 日志对象
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void warn(Logger log, Throwable e, String format, Object... arguments) {
        log.warn(format(format, arguments), e);
    }

    //------------------------ error
    /**
     * Error等级日志<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: error  
     * @Description:  
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void error(String format, Object... arguments) {
        error(innerGet(), format, arguments);
    }

    /**
     * Error等级日志<br>
     * @Title: error  
     * @Description:  
     * @param log 日志对象
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void error(Logger log, String format, Object... arguments) {
        log.error(format, arguments);
    }

    /**
     * Error等级日志<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: error  
     * @Description:  
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void error(Throwable e, String format, Object... arguments) {
        error(innerGet(), e, format(format, arguments));
    }

    /**
     * Error等级日志<br>
     * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
     * @Title: error  
     * @Description:  
     * @param log 日志对象
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本，{} 代表变量
     * @param arguments 变量对应的参数
     * @throws
     */
    public static void error(Logger log, Throwable e, String format, Object... arguments) {
        log.error(format(format, arguments), e);
    }

    //----------------------------------------------------------- Logger method end
     

    //----------------------------------------------------------- Private method start

    /**
     * 格式化文本
     * @Title: format  
     * @Description:  
     * @param template 文本模板，被替换的部分用 {} 表示
     * @param values 参数值
     * @return 格式化后的文本
     * @throws
     */
    private static  String format(String template, Object... values) {
    	return String.format(template.replace("{}", "%s"), values);
    }

    /**

     * @return 获得日志，自动判定日志发出者

     */

    private static Logger innerGet() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return LoggerFactory.getLogger(stackTrace[3].getClassName());

    }
	
	public static void main(String[] args) {
		LoggerUtil.getLogger().error("1111");
	}
}
